<?php
/* 
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 * Description of messages_controller
 *
 * @author zframework
 */
class EmailsController extends AppController {
    
    
    public function beforeFilter() {

        parent::beforeFilter();
        $this -> Security -> requireAuth('envoyer','lire','effacer');
        
    }
        

    function liste(){

        if ($this -> Session -> check('Auth.Utilisateur')){

            $utilisateur = $this -> Session -> read('Auth.Utilisateur');
            
            // création d'un jeton de securite
            $token = sha1(time()*rand(10,999));
            $this -> Session -> write("token",$token);

        } else {

            $this -> Session -> setFlash('Il faut ce connecter pour voir cette page','erreur');
            $this -> redirect('/utilisateurs/login');
        }
        
       $this ->loadModel("Recepteur");
       
       // pagination
       $this -> paginate = array(
           
           'limit' => 10,
           'fields' => array(
               'Email.titre',
               'Email.date',
               'Recepteur.email_id'
           ),
      
       );
       
       $recepteur = $this ->paginate("Recepteur",array(
           'Recepteur.utilisateur_id' => $utilisateur['id'],
       ));
       
       $infoEmail = array();
       
       for ($i = 0; $i <= sizeof($recepteur) - 1; $i++) {
           
           $infoEmail[$i]["titre"] = $recepteur[$i]["Email"]["titre"];
           $infoEmail[$i]["date"] = $recepteur[$i]["Email"]["date"];
           $infoEmail[$i]["id"] = $recepteur[$i]["Recepteur"]["email_id"];
           
           $destinataire = $this -> Recepteur -> find('all',array(
               'conditions' => array(
                   'Recepteur.email_id' => $recepteur[$i]["Recepteur"]["email_id"]
               ),
               'fields' => 'Utilisateur.pseudo'
               
           ));
           
           $dest = array();
           
           for ($a= 0; $a <= sizeof($destinataire) - 1; $a++) {
              
              $dest[sizeof($dest)] = $destinataire[$a]["Utilisateur"]["pseudo"];
               
          }
          
          $infoEmail[$i]["destinataire"] = $dest;  
           
       }
       

        $this -> set('email',$infoEmail);
        $this -> set('token',$token);

    }
    
    function lire($id = 0){
        
        // pagination
        
        $this -> paginate = array(      
            'order' => array('Message.date' => 'asc'),
            'limit' => 10,
            'fields' => array(
                'Message.corp',
                'Message.date',
                'Message.id',
                'Utilisateur.pseudo',
                'Utilisateur.avatar'
            )
          );
        
        // lecture des emails
        if ($this -> Session -> check('Auth.Utilisateur')){

            $utilisateur = $this -> Session -> read('Auth.Utilisateur');

        } else {

            $this -> Session -> setFlash('Il faut ce connecter pour voir cette page','erreur');
            $this -> redirect('/utilisateurs/login');
        }
        
        $this ->loadModel("Recepteur");
        
        // marqué comme lu
        $this -> Recepteur -> updateAll(array(
            'Recepteur.lu' => "'1'"
        ),array(
            'AND' => array(
                'Recepteur.email_id' => $id,
                'Recepteur.utilisateur_id' => $utilisateur["id"]
            )
            
        ));
        
        // verification de la requete (légal ou non)
        $message = $this -> Email -> Recepteur -> find('first',array(
                   'conditions' => array('AND' => array(
                       'Email.id' => $id,
                       'Recepteur.utilisateur_id' => $utilisateur["id"],
                       'Recepteur.email_id' => $id
                   )),
             ));
        
         
        if (isset($message) == false || $message == array()){
            
            $this -> Session -> setFlash('Une erreur est survenu!!','erreur');
            $this -> redirect(array('controller' => 'emails','action' =>'liste'));           
            
        }
        
        $this -> set('title_for_layout',$message["Email"]["titre"]);
        
        // lecture du mail
        $this ->loadModel('Message');
        
        $mail = $this -> paginate('Message',array(
                'Message.email_id' => $id,
            
        ));
              
        // modification de $mail pour s'implifier la vue
        $vue = array();
        
 
        for ($i = 0; $i <= sizeof($mail) - 1; $i++) {
            
     
            $vue[$i]["corps"] = nl2br($mail[$i]["Message"]["corp"]);
            $vue[$i]["date"] = $mail[$i]["Message"]["date"];
            $vue[$i]["pseudo"] = $mail[$i]["Utilisateur"]["pseudo"];
            $vue[$i]["avatar"] = $mail[$i]["Utilisateur"]["avatar"];
            $vue[$i]["id"] = $mail[$i]["Message"]["id"];
                 
        }
        
        // génération token
        $uniqid = uniqid();

        Cache::write($uniqid,array(
            "email_id" => $id,
            "utilisateur_id" => $utilisateur["id"],
            
        ));
        
        
        
        $this -> set('message',$vue);
        $this -> set('email_id',$id);
        $this -> set("uniqid",$uniqid);
        $this -> set("online",$utilisateur);
        $this -> set("date",date("c"));
            
    }
    
    function envoyer(){
        
        $this ->loadModel("Message");
        
        if (empty($this -> data) == false){

            $this -> Message -> set($this -> data);
            
            if (Cache::read($this -> data["Email"]["uniqid"]) == true){
                
                $info = Cache::read($this -> data["Email"]["uniqid"]);
                
                if ($info["utilisateur_id"] != $this -> data["Message"]["utilisateur_id"] || $info["email_id"] != $this -> data["Message"]["email_id"]){
  
                    $this -> Session -> setFlash('Une erreur est survenu!! [token invalide]','erreur');
                    $this -> redirect(array('controller' => 'emails','action' =>'liste'));
         
                }
                         
            } else {
                        
                $this -> Session -> setFlash('Une erreur est survenu!! [token]','erreur');
                $this -> redirect(array('controller' => 'emails','action' =>'liste'));                
                
                
            } 
            
            App::import('Sanitize');
            
            // sécurité contre les failles XSS et injections
            $this -> data = Sanitize::clean($this -> data,array("escape" => false));

            if ($this -> Message -> save($this -> data)){

                   // marqué comme non lu le message
                
                $this ->loadModel("Recepteur");
                
                $this -> Recepteur -> updateAll(array(
                         'Recepteur.lu' => "'0'",
                ),array(
                         'Recepteur.email_id' => $this -> data["Message"]["email_id"]
                ));
                
                // calcul de l'emplacement du message
                $count = $this -> Message -> find('count',array(
                    'fields' => 'DISTINCT Message.id',
                    'conditions' => array(
                        'Message.email_id' => $this -> data["Message"]["email_id"]
                    )
                ));
                $page = ceil($count/10);
                $id = $this -> Message -> field('id', null, 'id DESC');
                
                
                    $this -> Session -> setFlash('Votre message est envoyé','erreur');
                    $this -> redirect(array('controller' => 'emails','action' =>'lire',$this -> data["Message"]["email_id"],'page' => $page,'#'=> $id));
          
            } else {
            
            $this -> Session -> setFlash('Il n\'y a pas de réponse','erreur');
            $this -> redirect(array('controller' => 'emails','action' =>'lire',$this -> data["Message"]["email_id"]));
            
        }
        
        
        
        
        
    }
    
    }
    
    function effacer($id = 0){
         
        if (is_numeric($id) == false || $id <= 0){
            
            $this -> redirect(array('controller' => 'emails','action' => 'liste'));
            
        }
        
        // verification du jeton de sécurite
        $token_url = $this->params['named']['token'];
        $token_session = $this -> Session -> read('token');
        
        $this -> Session -> delete('token');
        
        if ($token_session != $token_url || isset($token_url) == false){
            
            $this-> Session -> setFlash("Token invalide",'erreur');
            $this -> redirect(array('controller' => 'emails','action' => 'liste'));
              
        }
        
        // recupération info utilisateur
        $utilisateur = $this -> Session -> read('Auth.Utilisateur');
        
        $droit = array(
            'createur' => false,
            'recepteur' => false
        );

        // determination des droits
        $createur = $this -> Email -> find('first',array(
            'conditions' => array(
                'Email.utilisateur_id' => $utilisateur["id"]
            ),
            'fields' => 'utilisateur_id'
        ));
        
        if (isset($createur) == true && $createur != array()){
            
            $droit["createur"] = true;
            
        }
        
        $this -> loadModel("Recepteur");
        $recepteur = $this -> Recepteur -> find('first',array(
            'conditions' => array(
                'AND' => array(
                    'Recepteur.email_id' => $id,
                    'Recepteur.utilisateur_id' => $utilisateur["id"]
                )
            ),
            'fields' => 'utilisateur_id'
        ));
        
        if (isset($recepteur) == true && $recepteur != array()){
            
            $droit["recepteur"] = true;
            
        } else {
            
            $this -> redirect(array('controller' => 'emails','action' => 'liste',$id));
            
        }
        
        // application des droits
        if ($droit["createur"]){
            
            $this -> Email -> delete($id);
            $this -> loadModel("Message");
            
            $this -> Message -> deleteAll(array(
                'Message.email_id' => $id
            ));
            
            $this -> Recepteur -> deleteAll(array(
                'Recepteur.email_id' => $id
            ));
            
            
        } else {
            
            
            $this -> Recepteur -> deleteAll(array(
                'AND' => array(
                   'Recepteur.email_id' => $id,
                   'Recepteur.utilisateur_id' => $utilisateur["id"]
                )
            ));
            
            
        }
        
        
        $this -> redirect(array('controller' => 'emails','action' => 'liste'));
         
    }
    
    function nouveauEmail(){
        
        $utilisateur = $this -> Session -> read('Auth.Utilisateur');
        $this -> set("utilisateur_id",$utilisateur["id"]);
        $this -> set('date', date('c'));
        
        // ajout d'un nouveau email
        if (empty($this -> data) == false){
            
            $this -> Email -> set($this -> data);
            
            // securite contre les failles XSS et injection
            App::import('Sanitize');
            $this -> data = Sanitize::clean($this -> data,array(
                'escape' => false,
            ));
           
            if ($this -> Email -> saveAll($this -> data,array('validate' => 'first'))){
                
                // ajout des recepteurs
                $destinataire = $this -> data["Recepteur"]["destinataire"];
                
                // veriification de destinataire
                if (preg_match('#[a-zA-Z0-9,]+#isU',$destinataire) == false){
                    
                    $this -> Session -> setFlash("Destinataire invalide","erreur");
                    $this -> redirect(array("controller" => "emails","action" => "nouveauEmail"));
                    
                }
                
                $destinataire = explode(",", $destinataire);
                
                // liste des destinataires
                $this -> loadModel("Recepteur");
                $this -> loadModel("Utilisateur");
                
                for ($i=0;$i<=sizeof($destinataire)-1;$i++){
                    
                    if (empty($destinataire[$i]) == false){
                        
                        // conversion pseudo -> id
                        $id = $this -> Utilisateur -> find('first',array(
                            "conditions" => array(
                                "Utilisateur.pseudo" => $destinataire[$i],
                            ),
                            "fields" => "Utilisateur.id",
                        ));
                        
                        // l'utilisateur n'existe pas
                        if (empty($id["Utilisateur"]["id"])){
                            
                            $this -> Session -> setFlash("Un utilisateur n'existe pas: ".$destinataire[$i],"erreur");
                            $this -> redirect(array("controller" => "emails","action" => "nouveauEmail"));
                            
                        }
                        
                        // creation de la requete
                        $this -> Recepteur -> create();
                        $this -> Recepteur -> save(array(
                            "Recepteur" => array(
                                "utilisateur_id" => $id["Utilisateur"]["id"],
                                "email_id" => $this -> Email -> field('id', null, 'id DESC'),
                                "lu" => '0'
                            )
                        ));   
                        
                    }
                    
                }
                
                // s'ajouter dans la liste de recepteur
                $this -> Recepteur -> create();
                $this -> Recepteur -> save(array(
                    "Recepteur"  => array(
                        "utilisateur_id" => $utilisateur["id"],
                        "email_id" => $this -> Email -> field('id', null, 'id DESC'),
                        "lu" => '1'
                    )
                ));
                
                
                $this -> Session-> setFlash("L'email vient d'être crée","erreur");
                $this -> redirect(array("controller" => "emails","action" => "liste"));
                
            }
            
            
            
            
            
            
        } else {
            
            
     
        }
        
        
        
    }


}
?>
